# Python 面向对象编程
"""
class 类名():
    属性1
    属性2
    属性3
    ...

    函数1
    函数2
    ....
"""


# 创建一个汽车类
#
# class MyCar():
#
#     # 定义属性：对象属性
#     # self 表示当前对象（实例）本身
#     # init 函数当前创建对象时就会自动执行
#     def __init__(self, brand, type_name, category, color):
#         print('开始初始化car对象')
#         # brand、type_name... 都是当前对象的属性（成员属性）
#         # 汽车品牌
#         self.brand = brand
#         # 汽车型号
#         self.type_name = type_name
#         # 汽车类型：SUV，轿车
#         self.category = category
#         # 汽车颜色
#         self.color = color
#
#     # 定义函数
#     def run(self):
#         """
#         run 函数就是车的行为
#         :return:
#         """
#         print(f"启动我的{self.brand}小汽车")
#         print("给油")
#         print("加速")
#         print(f"我的{self.category}真的是买对了")
#
#     def __new__(cls, *args, **kwargs):
#         print('创建Car的对象')
#         return super().__new__(cls)
#
#     def __str__(self):
#         # str魔法函数，以后只要有print(对象)，则会自动调用str函数，并且打印str函数的返回值
#         return "print函数传入对象，就会自动调用str函数"
#
#     def __del__(self):
#         print('开始删除对象')
#         # 可以在删除对象时记录一些日志等
#
#
# # 创建2个实例
# c1 = MyCar('BYD', '汉', '轿车', '白色')
# # c2 = MyCar('一汽大众', '迈腾', '轿车', '灰色')
# # c1.run()
# # print(f'_______{c1.category}_______')
# print(c1)
# del c1


# class Parson():
#     # 物种的名字，是类属性
#     species = '人类'
#
#     def __init__(self, name):
#         # 对象属性（成员属性、实例属性）
#         self.name = name
#
#
# p1 = Parson('张三')
# p2 = Parson('李四')


# print(p1.species)
# print(p2.species)
# print(p1.name)
# print(p2.name)

# # 访问对象属性
# p1.name
#
# # 访问类属性：两种方式都可以
# print(p1.species)
# print(Parson.species)

# 修改属性
# 修改对象属性（只会修改p1对象的属性，不影响p2对象的属性）
# print(f'修改对象属性前：{p1.name}')
# p1.name = 'hangman'
# print(f'修改对象属性后：{p1.name}')

# # 修改类属性
# print(f'修改类属性前：{p1.species}')
# Parson.species = '人科'  # 只有这一种方式
# print(f'修改类属性后：{Parson.species}')
#
# # 反例
# p1.species = '人属'
# print(f'错误的修改方式虽然看起来也可以修改：{p1.species}')
# # 但是这并不是修改类属性，而是增加了一个对象属性
# # 下面就来验证一下
# print(f'下面就来验证一下，错误的修改类属性没有成功：{p2.species}')
#

class Person():

    def __init__(self, name):  # 成员函数/对象函数/实例函数
        self.name = name

    def eat(self):  # 成员函数/对象函数/实例函数
        print(f'{self.name} eat!')

    @classmethod
    def work(cls, other, num=100):  # 类函数（所有对象共同拥有的函数）
        print(f'----{other}---')
        print('每个人都要工作')

    @staticmethod
    def run():
        print('每个人都可以跑起来')


p1 = Person('张三')
# p1.eat()
# # 类函数调用: 两种方法
# p1.work('abc')
# Person.work('def')

# 静态函数调用：两种方法
p1.run()
Person.run()
